package cn.xshi.actuator.jvm;
import cn.xshi.actuator.model.JInfo;
import cn.xshi.actuator.util.ExecuteCmd;
import cn.xshi.actuator.util.ActuatorSDKUtil;

import java.util.Arrays;
import java.util.stream.Collectors;
/**
 * @Desc
 * jinfo(Configuration Info for Java) 查看虚拟机配置参数信思，也可用于调整虚拟机的配置参数。
 * 在很多情况下，Java应用程序不会指定所有的Java虚拟机参数。而此时，开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下，可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了 jinfo工具，开发人员可以很方便地找到Java虚拟机参数的当前值。
 * jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值， 甚至可以在运行时修改部分参 数，并使之立即生效。 但是，并非所有参数都支持动态修改。参数只有被标记 manageable的flag可以被实时修改。其实，这个修改能力是 极其有限的。
 * @Author 邓纯杰
 * @CreateTime 2013-10-05 17:15:42
 */
public class JInfoUtil {
    /**
     * JVM默认参数与指定参数
     * (查看虚拟机配置参数信思，也可用于调整虚拟机的配置参数)
     * 查看该进程的全部配置信息
     * @return
     */
    public static JInfo info(){
        String s = ExecuteCmd.execute(new String[]{"jinfo","-flags", ActuatorSDKUtil.getPid()});
        if (!s.contains("successfully")){
            return null;
        }
        String flags = "flags:";
        String command = "Command line:";
        //默认参数
        String[] nonDefault = ActuatorSDKUtil.trim(s.substring(s.indexOf(flags)+flags.length(),s.indexOf(command)).split("\\s+"));
        String[] commandLine = null;
        s = s.substring(s.indexOf(command));
        if (!s.equals(command)){
            commandLine = s.substring(command.length()).split("\\s+");
        }
        commandLine = ActuatorSDKUtil.trim(commandLine);
        return new JInfo(Arrays.stream(nonDefault).collect(Collectors.toList()), Arrays.stream(commandLine).collect(Collectors.toList()) );
    }
}
